1   /*
2    * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   */
23  
24  /*
25   * @test
26   * @bug 4716807
27   * @summary Test the ObjectName.apply(ObjectName) method
28   *          with wildcards in the key properties value part.
29   * @author Luis-Miguel Alventosa
30   * @run clean ApplyWildcardTest
31   * @run build ApplyWildcardTest
32   * @run main ApplyWildcardTest
33   */
34  
35  import javax.management.ObjectName;
36  
37  public class ApplyWildcardTest {
38  
39      private static final String positiveTests[][] = {
40          { "d:k=*", "d:k=\"\"" },
41  
42          { "d:k=*", "d:k=" },
43          { "d:k=*", "d:k=v" },
44          { "d:k=a*b", "d:k=axyzb" },
45          { "d:k=a*b,*", "d:k=axyzb,k2=v2" },
46          { "d:*,k=a*b", "d:k=axyzb,k2=v2" },
47          { "d:k=?", "d:k=v" },
48          { "d:k=a?b", "d:k=axb" },
49          { "d:k=a?b,*", "d:k=axb,k2=v2" },
50          { "d:*,k=a?b", "d:k=axb,k2=v2" },
51          { "d:k=?*", "d:k=axyzb" },
52          { "d:k=a?bc*d", "d:k=axbcyzd" },
53          { "d:k=a?bc*d,*", "d:k=axbcyzd,k2=v2" },
54          { "d:*,k=a?bc*d", "d:k=axbcyzd,k2=v2" },
55          { "d:k1=?,k2=*", "d:k1=a,k2=ab" },
56          { "d:k1=a?b,k2=c*d", "d:k1=axb,k2=cyzd" },
57          { "d:k1=a?b,k2=c*d,*", "d:k1=axb,k2=cyzd,k3=v3" },
58          { "d:*,k1=a?b,k2=c*d", "d:k1=axb,k2=cyzd,k3=v3" },
59  
60          { "d:k=\"*\"", "d:k=\"\"" },
61          { "d:k=\"*\"", "d:k=\"v\"" },
62          { "d:k=\"a*b\"", "d:k=\"axyzb\"" },
63          { "d:k=\"a*b\",*", "d:k=\"axyzb\",k2=\"v2\"" },
64          { "d:*,k=\"a*b\"", "d:k=\"axyzb\",k2=\"v2\"" },
65          { "d:k=\"?\"", "d:k=\"v\"" },
66          { "d:k=\"a?b\"", "d:k=\"axb\"" },
67          { "d:k=\"a?b\",*", "d:k=\"axb\",k2=\"v2\"" },
68          { "d:*,k=\"a?b\"", "d:k=\"axb\",k2=\"v2\"" },
69          { "d:k=\"?*\"", "d:k=\"axyzb\"" },
70          { "d:k=\"a?bc*d\"", "d:k=\"axbcyzd\"" },
71          { "d:k=\"a?bc*d\",*", "d:k=\"axbcyzd\",k2=\"v2\"" },
72          { "d:*,k=\"a?bc*d\"", "d:k=\"axbcyzd\",k2=\"v2\"" },
73          { "d:k1=\"?\",k2=\"*\"", "d:k1=\"a\",k2=\"ab\"" },
74          { "d:k1=\"a?b\",k2=\"c*d\"", "d:k1=\"axb\",k2=\"cyzd\"" },
75          { "d:k1=\"a?b\",k2=\"c*d\",*", "d:k1=\"axb\",k2=\"cyzd\",k3=\"v3\"" },
76          { "d:*,k1=\"a?b\",k2=\"c*d\"", "d:k1=\"axb\",k2=\"cyzd\",k3=\"v3\"" },
77      };
78  
79      private static final String negativeTests[][] = {
80          { "d:k=\"*\"", "d:k=" },
81  
82          { "d:k=*", "d:k=,k2=" },
83          { "d:k=*", "d:k=v,k2=v2" },
84          { "d:k=a*b", "d:k=axyzbc" },
85          { "d:k=a*b,*", "d:k=axyzbc,k2=v2" },
86          { "d:*,k=a*b", "d:k=axyzbc,k2=v2" },
87          { "d:k=?", "d:k=xyz" },
88          { "d:k=a?b", "d:k=ab" },
89          { "d:k=a?b,*", "d:k=ab,k2=v2" },
90          { "d:*,k=a?b", "d:k=ab,k2=v2" },
91          { "d:k=?*", "d:k=axyzb,k2=v2" },
92          { "d:k=a?bc*d", "d:k=abcd" },
93          { "d:k=a?bc*d,*", "d:k=abcd,k2=v2" },
94          { "d:*,k=a?bc*d", "d:k=abcd,k2=v2" },
95          { "d:k1=?,k2=*", "d:k1=ab,k2=ab" },
96          { "d:k1=a?b,k2=c*d", "d:k1=ab,k2=cd" },
97          { "d:k1=a?b,k2=c*d,*", "d:k1=ab,k2=cd,k3=v3" },
98          { "d:*,k1=a?b,k2=c*d", "d:k1=ab,k2=cd,k3=v3" },
99  
100         { "d:k=\"*\"", "d:k=\"\",k2=\"\"" },
101         { "d:k=\"*\"", "d:k=\"v\",k2=\"v2\"" },
102         { "d:k=\"a*b\"", "d:k=\"axyzbc\"" },
103         { "d:k=\"a*b\",*", "d:k=\"axyzbc\",k2=\"v2\"" },
104         { "d:*,k=\"a*b\"", "d:k=\"axyzbc\",k2=\"v2\"" },
105         { "d:k=\"?\"", "d:k=\"xyz\"" },
106         { "d:k=\"a?b\"", "d:k=\"ab\"" },
107         { "d:k=\"a?b\",*", "d:k=\"ab\",k2=\"v2\"" },
108         { "d:*,k=\"a?b\"", "d:k=\"ab\",k2=\"v2\"" },
109         { "d:k=\"?*\"", "d:k=\"axyzb\",k2=\"v2\"" },
110         { "d:k=\"a?bc*d\"", "d:k=\"abcd\"" },
111         { "d:k=\"a?bc*d\",*", "d:k=\"abcd\",k2=\"v2\"" },
112         { "d:*,k=\"a?bc*d\"", "d:k=\"abcd\",k2=\"v2\"" },
113         { "d:k1=\"?\",k2=\"*\"", "d:k1=\"ab\",k2=\"ab\"" },
114         { "d:k1=\"a?b\",k2=\"c*d\"", "d:k1=\"ab\",k2=\"cd\"" },
115         { "d:k1=\"a?b\",k2=\"c*d\",*", "d:k1=\"ab\",k2=\"cd\",k3=\"v3\"" },
116         { "d:*,k1=\"a?b\",k2=\"c*d\"", "d:k1=\"ab\",k2=\"cd\",k3=\"v3\"" },
117     };
118 
119     private static int runPositiveTests() {
120         int error = 0;
121         for (int i = 0; i < positiveTests.length; i++) {
122             System.out.println("----------------------------------------------");
123             try {
124                 ObjectName on1 = ObjectName.getInstance(positiveTests[i][0]);
125                 ObjectName on2 = ObjectName.getInstance(positiveTests[i][1]);
126                 System.out.println("\"" + on1 + "\".apply(\"" + on2 + "\")");
127                 boolean result = on1.apply(on2);
128                 System.out.println("Result = " + result);
129                 if (result == false) {
130                     error++;
131                     System.out.println("Test failed!");
132                 } else {
133                     System.out.println("Test passed!");
134                 }
135             } catch (Exception e) {
136                 error++;
137                 System.out.println("Got Unexpected Exception = " + e.toString());
138                 System.out.println("Test failed!");
139             }
140             System.out.println("----------------------------------------------");
141         }
142         return error;
143     }
144 
145     private static int runNegativeTests() {
146         int error = 0;
147         for (int i = 0; i < negativeTests.length; i++) {
148             System.out.println("----------------------------------------------");
149             try {
150                 ObjectName on1 = ObjectName.getInstance(negativeTests[i][0]);
151                 ObjectName on2 = ObjectName.getInstance(negativeTests[i][1]);
152                 System.out.println("\"" + on1 + "\".apply(\"" + on2 + "\")");
153                 boolean result = on1.apply(on2);
154                 System.out.println("Result = " + result);
155                 if (result == true) {
156                     error++;
157                     System.out.println("Test failed!");
158                 } else {
159                     System.out.println("Test passed!");
160                 }
161             } catch (Exception e) {
162                 error++;
163                 System.out.println("Got Unexpected Exception = " + e.toString());
164                 System.out.println("Test failed!");
165             }
166             System.out.println("----------------------------------------------");
167         }
168         return error;
169     }
170 
171     public static void main(String[] args) throws Exception {
172 
173         int error = 0;
174 
175         // Check null values
176         //
177         System.out.println("----------------------------------------------");
178         System.out.println("Test ObjectName.apply(null)");
179         try {
180             new ObjectName("d:k=v").apply(null);
181             error++;
182             System.out.println("Didn't get expected NullPointerException!");
183             System.out.println("Test failed!");
184         } catch (NullPointerException e) {
185             System.out.println("Got expected exception '" + e.toString() + "'");
186             System.out.println("Test passed!");
187         } catch (Exception e) {
188             error++;
189             System.out.println("Got unexpected exception '" + e.toString() + "'");
190             System.out.println("Test failed!");
191         }
192         System.out.println("----------------------------------------------");
193 
194         // Check domain pattern values
195         //
196         System.out.println("----------------------------------------------");
197         System.out.println("Test ObjectName.apply(domain_pattern)");
198         try {
199             if (new ObjectName("d:k=v").apply(new ObjectName("*:k=v"))) {
200                 error++;
201                 System.out.println("Got 'true' expecting 'false'");
202                 System.out.println("Test failed!");
203             } else {
204                 System.out.println("Got expected return value 'false'");
205                 System.out.println("Test passed!");
206             }
207         } catch (Exception e) {
208             error++;
209             System.out.println("Got unexpected exception = " + e.toString());
210             System.out.println("Test failed!");
211         }
212         System.out.println("----------------------------------------------");
213 
214         // Check key property list pattern values
215         //
216         System.out.println("----------------------------------------------");
217         System.out.println("Test ObjectName.apply(key_property_list_pattern)");
218         try {
219             if (new ObjectName("d:k=v").apply(new ObjectName("d:k=v,*"))) {
220                 error++;
221                 System.out.println("Got 'true' expecting 'false'");
222                 System.out.println("Test failed!");
223             } else {
224                 System.out.println("Got expected return value 'false'");
225                 System.out.println("Test passed!");
226             }
227         } catch (Exception e) {
228             error++;
229             System.out.println("Got unexpected exception = " + e.toString());
230             System.out.println("Test failed!");
231         }
232         System.out.println("----------------------------------------------");
233 
234         // Check key property value pattern values
235         //
236         System.out.println("----------------------------------------------");
237         System.out.println("Test ObjectName.apply(key_property_value_pattern)");
238         try {
239             if (new ObjectName("d:k=v").apply(new ObjectName("d:k=*"))) {
240                 error++;
241                 System.out.println("Got 'true' expecting 'false'");
242                 System.out.println("Test failed!");
243             } else {
244                 System.out.println("Got expected return value 'false'");
245                 System.out.println("Test passed!");
246             }
247         } catch (Exception e) {
248             error++;
249             System.out.println("Got unexpected exception = " + e.toString());
250             System.out.println("Test failed!");
251         }
252         System.out.println("----------------------------------------------");
253 
254         error += runPositiveTests();
255         error += runNegativeTests();
256 
257         if (error > 0) {
258             final String msg = "Test FAILED! Got " + error + " error(s)";
259             System.out.println(msg);
260             throw new IllegalArgumentException(msg);
261         } else {
262             System.out.println("Test PASSED!");
263         }
264     }
265 }